import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:get/get.dart' hide Response;
import '../routes/app_routes.dart';
import 'dart:math';

/// 请求追踪中间件
/// 
/// 该中间件用于追踪HTTP请求信息，记录请求路径和来源页面。
/// 这对于调试复杂应用中的API调用非常有用。
/// 
/// 主要功能：
/// 1. 记录发起请求时所在的页面
/// 2. 为请求、响应和错误提供美观的日志输出
/// 
/// 使用方法：
/// 在Dio实例中添加此中间件：
/// ```dart
/// dio.interceptors.add(RequestTracingMiddleware());
/// ```
/// 
/// 注意：仅在调试模式下生效，不会影响发布版本的性能。
class RequestTracingMiddleware extends Interceptor {
  // 调试开关，设置为true时打印详细堆栈信息
  static bool debugStackTrace = false;
  
  // 要特别关注的路径列表，这些路径的请求会打印堆栈信息
  static List<String> debugPaths = [
    '/data/alert_log/list',    // 告警日志请求
    '/device/device/list',     // 设备列表请求
    '/product/product/list',   // 产品列表请求
  ];
  
  // 堆栈打印行数，默认10行
  static int maxStackLines = 20;
  
  @override
  void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
    if (kDebugMode) {
      try {
        // 获取当前页面路由
        final currentRoute = Get.currentRoute;
        final pageName = _getPageNameFromRoute(currentRoute);
        
        // 记录请求追踪信息
        debugPrint('╔══════════════════ 请求追踪 ══════════════════╗');
        debugPrint('║ 路径: ${options.method} ${options.path}');
        debugPrint('║ 来源: $pageName');
        debugPrint('╚═════════════════════════════════════════════╝');
        
        // 存储追踪信息到请求中，方便响应时使用
        options.extra['requestTracing'] = {
          'page': pageName,
          'route': currentRoute,
          'requestPath': options.path,
        };
        
        // 检查是否需要为当前请求打印详细堆栈
        final shouldDebug = debugStackTrace || 
                           debugPaths.any((path) => options.path.contains(path));
        
        // 在调试模式下打印部分堆栈信息，帮助分析
        if (shouldDebug) {
          final stackTrace = StackTrace.current.toString();
          final lines = stackTrace.split('\n');
          final int stackLinesToPrint = min(maxStackLines, lines.length);
          debugPrint('【请求追踪】调用堆栈详情($stackLinesToPrint行):');
          for (int i = 0; i < stackLinesToPrint; i++) {
            debugPrint('  ${i + 1}. ${lines[i]}');
          }
        }
      } catch (e) {
        debugPrint('【请求追踪】分析日志失败: $e');
      }
    }
    
    // 继续处理请求
    handler.next(options);
  }
  
  @override
  void onResponse(Response response, ResponseInterceptorHandler handler) {
    if (kDebugMode) {
      try {
        final tracingInfo = response.requestOptions.extra['requestTracing'];
        if (tracingInfo != null) {
          debugPrint('┌─────────── 响应追踪 ───────────┐');
          debugPrint('│ 路径: ${response.requestOptions.path}');
          debugPrint('│ 状态: ${response.statusCode}');
          debugPrint('│ 来源: ${tracingInfo['page']}');
          debugPrint('└─────────────────────────────────┘');
        }
      } catch (e) {
        debugPrint('【响应追踪】获取追踪信息失败: $e');
      }
    }
    
    // 继续处理响应
    handler.next(response);
  }
  
  @override
  void onError(DioException err, ErrorInterceptorHandler handler) {
    if (kDebugMode) {
      try {
        final tracingInfo = err.requestOptions.extra['requestTracing'];
        if (tracingInfo != null) {
          debugPrint('┏━━━━━━━━━━━ 错误追踪 ━━━━━━━━━━━┓');
          debugPrint('┃ 路径: ${err.requestOptions.path}');
          debugPrint('┃ 错误: ${err.message}');
          debugPrint('┃ 来源: ${tracingInfo['page']}');
          debugPrint('┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛');
        }
      } catch (e) {
        debugPrint('【错误追踪】获取追踪信息失败: $e');
      }
    }
    
    // 继续处理错误
    handler.next(err);
  }
  
  /// 从路由获取页面名称
  String _getPageNameFromRoute(String route) {
    // 如果无法从路由表匹配，尝试从路由字符串提取
    try {
      // 移除前缀斜杠和查询参数
      final cleanRoute = route.startsWith('/') ? route.substring(1) : route;
      final firstSegment = cleanRoute.split('/').first.split('?').first;
      
      if (firstSegment.isNotEmpty) {
        // 将snake_case转换为PascalCase并添加'Page'后缀
        final words = firstSegment.split('_');
        final pascalCase = words.map((word) => 
          word.isNotEmpty ? word.substring(0, 1).toUpperCase() + word.substring(1) : ''
        ).join('');
        
        return '${pascalCase}Page';
      }
    } catch (e) {
      debugPrint('【路由分析】从路径提取页面名称失败: $e');
    }
    
    // 根据路由路径匹配页面名称
    switch (route) {
      case Routes.home:
        return 'HomePage';
      case Routes.login:
        return 'LoginPage';
      case Routes.profile:
        return 'ProfilePage';
      case Routes.product:
        return 'ProductPage';
      case Routes.device:
        return 'DevicePage';
      case Routes.alertLogs:
        return 'AlertLogsPage';
      default:
        return '未知页面';
    }
  }
} 